package controlador;

import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;

import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;

import modelo.Categoria;
import modelo.Datos;
import modelo.DetalleProducto;
import modelo.Ingrediente;
import modelo.Producto;


import vista.DlgProducto;

public class ContProducto {
	private class Detalle {
		public Detalle(Ingrediente ingr, double cant) {
			ingrediente = ingr;
			cantidad = cant;
		}
		
		Ingrediente ingrediente;
		double cantidad;
	}

	private DlgProducto dlg = null;
	private ArrayList<Detalle> lista = new ArrayList<Detalle>();
	private ArrayList<Categoria> categorias;
	private AbstractTableModel tmodelo = null;
	private ComboBoxModel cbl;
	private JFrame frm;
	
	public ContProducto() {
	}
	
	public void mostrarAnadir(JFrame frame) {
		dlg = new DlgProducto(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.setTitle("Agregar producto");
		
		frm = frame;
		categorias = Datos.getInstancia().getCategorias().categoriasGeneral();

		cbl = new DefaultComboBoxModel(categorias.toArray());
		dlg.getCbCategoria().setModel(cbl);

		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 2;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Ingrediente";
				case 1: return "Cantidad";
				}
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.size();
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista.get(row); 
				switch (col) {
				case 0: return obj.ingrediente.getNombre();
				case 1: return String.format("%.2f", obj.cantidad).replace(',', '.');
				}
				return null;
			}

			@Override
			public void setValueAt(Object value, int row, int col) {
				Detalle obj = lista.get(row);

				try {
					double n = Double.parseDouble(value.toString());
					if (n > 0) {
						obj.cantidad = n;
						fireTableRowsUpdated(row, row);
					} else
						dlg.mostrarMensaje("Se requiere un número superior a 0.");
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor inválido.");
				}
			}
			
			@Override
			public boolean isCellEditable(int row, int col) {
				return col == 1;
			}
		};
		
		dlg.getTblIngredientes().setModel(tmodelo);
		
		dlg.getBtAnadir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ContSelecIngre c = new ContSelecIngre();
				Ingrediente ingr = c.mostrar(frm);
				if (ingr != null) {
					lista.add(new Detalle(ingr, 1));
					int i = tmodelo.getRowCount();
					tmodelo.fireTableRowsInserted(i, i);
				}
			}
		});
		
		dlg.getBtQuitar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int i = dlg.getTblIngredientes().getSelectedRow();
				if (i >= 0) {
					lista.remove(i);
					tmodelo.fireTableRowsDeleted(i, i);
				}
			}
		});
		
		dlg.getBtAceptar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				try {
					String nombre = dlg.getTxtNombre().getText();
					double precio = Double.parseDouble(dlg.getTxtPrecio().getText());
					Categoria cat = (Categoria) cbl.getSelectedItem();
					
					if (nombre.length() == 0) {
						dlg.mostrarMensaje("Campo vacio para el nombre.");
					} else {
						Producto pr = Datos.getInstancia().getProductos().anadir(nombre, precio, cat);
						for (Detalle det : lista)
							Datos.getInstancia().getDetallesProducto().anadir(pr, det.ingrediente, det.cantidad);
						
						if(dlg.getTblIngredientes().getRowCount()!=0)
						{
							dlg.mostrarMensaje("REGISTRADO");
							dlg.dispose();
						}
						else
							dlg.mostrarMensaje("Debe Agregar Ingredientes");
					}
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor invalido para el campo de precio.");
				}
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				dlg.dispose();
			}
		});

		dlg.setModalityType(ModalityType.APPLICATION_MODAL);
		dlg.setVisible(true);
	}

	public void mostrarModificar(JFrame frame, final Producto pr) {
		dlg = new DlgProducto(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.setTitle("Modificar producto");
		
		categorias = Datos.getInstancia().getCategorias().categoriasGeneral();

		cbl = new DefaultComboBoxModel(categorias.toArray());
		dlg.getCbCategoria().setModel(cbl);
		
		dlg.getTxtNombre().setText(pr.getNombre());
		dlg.getTxtPrecio().setText(String.format("%.2f", pr.getPrecio()).replace(',', '.'));
		cbl.setSelectedItem(pr.getCategoria());
		
		for (DetalleProducto det : Datos.getInstancia().getDetallesProducto().detallesPorProducto(pr.getCodigo()))
			lista.add(new Detalle(det.ingrediente, det.cantidad));
		
		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 2;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Ingrediente";
				case 1: return "Cantidad";
				}
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.size();
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista.get(row); 
				switch (col) {
				case 0: return obj.ingrediente.getNombre();
				case 1: return String.format("%.2f", obj.cantidad).replace(',', '.');
				}
				return null;
			}

			@Override
			public void setValueAt(Object value, int row, int col) {
				Detalle obj = lista.get(row);

				try {
					double n = Double.parseDouble(value.toString());
					if (n > 0) {
						obj.cantidad = n;
						fireTableRowsUpdated(row, row);
					} else
						dlg.mostrarMensaje("Se requiere un numero superior a 0.");
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor invalido.");
				}
			}
			
			@Override
			public boolean isCellEditable(int row, int col) {
				return col == 1;
			}
		};
		
		dlg.getTblIngredientes().setModel(tmodelo);
		
		dlg.getBtAnadir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ContSelecIngre c = new ContSelecIngre();
				Ingrediente ingr = c.mostrar(frm);
				if (ingr != null) {
					lista.add(new Detalle(ingr, 1));
					int i = tmodelo.getRowCount();
					tmodelo.fireTableRowsInserted(i, i);
				}
			}
		});
		
		dlg.getBtQuitar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int i = dlg.getTblIngredientes().getSelectedRow();
				if (i >= 0) {
					lista.remove(i);
					tmodelo.fireTableRowsDeleted(i, i);
				}
			}
		});
		
		dlg.getBtAceptar().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				try {
					String nombre = dlg.getTxtNombre().getText();
					double precio = Double.parseDouble(dlg.getTxtPrecio().getText());
					Categoria cat = (Categoria) cbl.getSelectedItem();
					
					if (nombre.length() == 0) {
						dlg.mostrarMensaje("Campo vacio para el nombre.");
					} else {
						pr.setNombre(nombre);
						pr.setPrecio(precio);
						pr.setCategoria(cat);
						
						Datos.getInstancia().getDetallesProducto().eliminarPorProducto(pr.getCodigo());
						
						for (Detalle det : lista)
							Datos.getInstancia().getDetallesProducto().anadir(pr, det.ingrediente, det.cantidad);
						
						if(dlg.getTblIngredientes().getRowCount()!=0)
						{
							dlg.mostrarMensaje("MODIFICADO");
							dlg.dispose();
						}
						else
							dlg.mostrarMensaje("Debe Agregar Ingredientes");
						
					}
					
				} catch (NumberFormatException ex) {
					dlg.mostrarMensaje("Valor invalido para el campo de precio.");
				}
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				dlg.dispose();
			}
		});

		dlg.setModalityType(ModalityType.APPLICATION_MODAL);
		dlg.setVisible(true);
	}
}
